<?php

/**
 * FerOS PHP Framework
 * @author feros<admin@feros.com.cn>
 * @copyright ©2014 feros.com.cn
 * @link http://www.feros.com.cn
 * @version 2.0
 */

namespace tool;

use \base\common;

/**
 * 拼音处理类
 * @author sanliang
 */
class pinyin extends common {

    private $d = array(array('a', -20319), array('ai', -20317), array('an', -20304), array('ang', -20295), array('ao', -20292), array('ba', -20283), array('bai', -20265), array('ban', -20257), array('bang', -20242), array('bao', -20230), array('bei', -20051), array('ben', -20036), array('beng', -20032), array('bi', -20026), array('bian', -20002), array('biao', -19990), array('bie', -19986), array('bin', -19982), array('bing', -19976), array('bo', -19805), array('bu', -19784), array('ca', -19775), array('cai', -19774), array('can', -19763), array('cang', -19756), array('cao', -19751), array('ce', -19746), array('ceng', -19741), array('cha', -19739), array('chai', -19728), array('chan', -19725), array('chang', -19715), array('chao', -19540), array('che', -19531), array('chen', -19525), array('cheng', -19515), array('chi', -19500), array('chong', -19484), array('chou', -19479), array('chu', -19467), array('chuai', -19289), array('chuan', -19288), array('chuang', -19281), array('chui', -19275), array('chun', -19270), array('chuo', -19263), array('ci', -19261), array('cong', -19249), array('cou', -19243), array('cu', -19242), array('cuan', -19238), array('cui', -19235), array('cun', -19227), array('cuo', -19224), array('da', -19218), array('dai', -19212), array('dan', -19038), array('dang', -19023), array('dao', -19018), array('de', -19006), array('deng', -19003), array('di', -18996), array('dian', -18977), array('diao', -18961), array('die', -18952), array('ding', -18783), array('diu', -18774), array('dong', -18773), array('dou', -18763), array('du', -18756), array('duan', -18741), array('dui', -18735), array('dun', -18731), array('duo', -18722), array('e', -18710), array('en', -18697), array('er', -18696), array('fa', -18526), array('fan', -18518), array('fang', -18501), array('fei', -18490), array('fen', -18478), array('feng', -18463), array('fo', -18448), array('fou', -18447), array('fu', -18446), array('ga', -18239), array('gai', -18237), array('gan', -18231), array('gang', -18220), array('gao', -18211), array('ge', -18201), array('gei', -18184), array('gen', -18183), array('geng', -18181), array('gong', -18012), array('gou', -17997), array('gu', -17988), array('gua', -17970), array('guai', -17964), array('guan', -17961), array('guang', -17950), array('gui', -17947), array('gun', -17931), array('guo', -17928), array('ha', -17922), array('hai', -17759), array('han', -17752), array('hang', -17733), array('hao', -17730), array('he', -17721), array('hei', -17703), array('hen', -17701), array('heng', -17697), array('hong', -17692), array('hou', -17683), array('hu', -17676), array('hua', -17496), array('huai', -17487), array('huan', -17482), array('huang', -17468), array('hui', -17454), array('hun', -17433), array('huo', -17427), array('ji', -17417), array('jia', -17202), array('jian', -17185), array('jiang', -16983), array('jiao', -16970), array('jie', -16942), array('jin', -16915), array('jing', -16733), array('jiong', -16708), array('jiu', -16706), array('ju', -16689), array('juan', -16664), array('jue', -16657), array('jun', -16647), array('ka', -16474), array('kai', -16470), array('kan', -16465), array('kang', -16459), array('kao', -16452), array('ke', -16448), array('ken', -16433), array('keng', -16429), array('kong', -16427), array('kou', -16423), array('ku', -16419), array('kua', -16412), array('kuai', -16407), array('kuan', -16403), array('kuang', -16401), array('kui', -16393), array('kun', -16220), array('kuo', -16216), array('la', -16212), array('lai', -16205), array('lan', -16202), array('lang', -16187), array('lao', -16180), array('le', -16171), array('lei', -16169), array('leng', -16158), array('li', -16155), array('lia', -15959), array('lian', -15958), array('liang', -15944), array('liao', -15933), array('lie', -15920), array('lin', -15915), array('ling', -15903), array('liu', -15889), array('long', -15878), array('lou', -15707), array('lu', -15701), array('lv', -15681), array('luan', -15667), array('lue', -15661), array('lun', -15659), array('luo', -15652), array('ma', -15640), array('mai', -15631), array('man', -15625), array('mang', -15454), array('mao', -15448), array('me', -15436), array('mei', -15435), array('men', -15419), array('meng', -15416), array('mi', -15408), array('mian', -15394), array('miao', -15385), array('mie', -15377), array('min', -15375), array('ming', -15369), array('miu', -15363), array('mo', -15362), array('mou', -15183), array('mu', -15180), array('na', -15165), array('nai', -15158), array('nan', -15153), array('nang', -15150), array('nao', -15149), array('ne', -15144), array('nei', -15143), array('nen', -15141), array('neng', -15140), array('ni', -15139), array('nian', -15128), array('niang', -15121), array('niao', -15119), array('nie', -15117), array('nin', -15110), array('ning', -15109), array('niu', -14941), array('nong', -14937), array('nu', -14933), array('nv', -14930), array('nuan', -14929), array('nue', -14928), array('nuo', -14926), array('o', -14922), array('ou', -14921), array('pa', -14914), array('pai', -14908), array('pan', -14902), array('pang', -14894), array('pao', -14889), array('pei', -14882), array('pen', -14873), array('peng', -14871), array('pi', -14857), array('pian', -14678), array('piao', -14674), array('pie', -14670), array('pin', -14668), array('ping', -14663), array('po', -14654), array('pu', -14645), array('qi', -14630), array('qia', -14594), array('qian', -14429), array('qiang', -14407), array('qiao', -14399), array('qie', -14384), array('qin', -14379), array('qing', -14368), array('qiong', -14355), array('qiu', -14353), array('qu', -14345), array('quan', -14170), array('que', -14159), array('qun', -14151), array('ran', -14149), array('rang', -14145), array('rao', -14140), array('re', -14137), array('ren', -14135), array('reng', -14125), array('ri', -14123), array('rong', -14122), array('rou', -14112), array('ru', -14109), array('ruan', -14099), array('rui', -14097), array('run', -14094), array('ruo', -14092), array('sa', -14090), array('sai', -14087), array('san', -14083), array('sang', -13917), array('sao', -13914), array('se', -13910), array('sen', -13907), array('seng', -13906), array('sha', -13905), array('shai', -13896), array('shan', -13894), array('shang', -13878), array('shao', -13870), array('she', -13859), array('shen', -13847), array('sheng', -13831), array('shi', -13658), array('shou', -13611), array('shu', -13601), array('shua', -13406), array('shuai', -13404), array('shuan', -13400), array('shuang', -13398), array('shui', -13395), array('shun', -13391), array('shuo', -13387), array('si', -13383), array('song', -13367), array('sou', -13359), array('su', -13356), array('suan', -13343), array('sui', -13340), array('sun', -13329), array('suo', -13326), array('ta', -13318), array('tai', -13147), array('tan', -13138), array('tang', -13120), array('tao', -13107), array('te', -13096), array('teng', -13095), array('ti', -13091), array('tian', -13076), array('tiao', -13068), array('tie', -13063), array('ting', -13060), array('tong', -12888), array('tou', -12875), array('tu', -12871), array('tuan', -12860), array('tui', -12858), array('tun', -12852), array('tuo', -12849), array('wa', -12838), array('wai', -12831), array('wan', -12829), array('wang', -12812), array('wei', -12802), array('wen', -12607), array('weng', -12597), array('wo', -12594), array('wu', -12585), array('xi', -12556), array('xia', -12359), array('xian', -12346), array('xiang', -12320), array('xiao', -12300), array('xie', -12120), array('xin', -12099), array('xing', -12089), array('xiong', -12074), array('xiu', -12067), array('xu', -12058), array('xuan', -12039), array('xue', -11867), array('xun', -11861), array('ya', -11847), array('yan', -11831), array('yang', -11798), array('yao', -11781), array('ye', -11604), array('yi', -11589), array('yin', -11536), array('ying', -11358), array('yo', -11340), array('yong', -11339), array('you', -11324), array('yu', -11303), array('yuan', -11097), array('yue', -11077), array('yun', -11067), array('za', -11055), array('zai', -11052), array('zan', -11045), array('zang', -11041), array('zao', -11038), array('ze', -11024), array('zei', -11020), array('zen', -11019), array('zeng', -11018), array('zha', -11014), array('zhai', -10838), array('zhan', -10832), array('zhang', -10815), array('zhao', -10800), array('zhe', -10790), array('zhen', -10780), array('zheng', -10764), array('zhi', -10587), array('zhong', -10544), array('zhou', -10533), array('zhu', -10519), array('zhua', -10331), array('zhuai', -10329), array('zhuan', -10328), array('zhuang', -10322), array('zhui', -10315), array('zhun', -10309), array('zhuo', -10307), array('zi', -10296), array('zong', -10281), array('zou', -10274), array('zu', -10270), array('zuan', -10262), array('zui', -10260), array('zun', -10256), array('zuo', -10254));

    /**
     * 将中英文字符串转换成拼音
     * @param type $chinese
     * @param type $type 1 转换成首字母 0转换成全拼
     * @return array
     */
    public function init($chinese, $type = 0) {
        $i = 0;
        $pinyin = array();
        $arr = array();
        while (1) {
            $str = $this->t_string->msubstr($chinese, $i, 1);
            if (!empty($str)) {
                $arr[$i] = $str;
                $str = $this->t_string->charset($str, 'utf-8', 'gbk');
                if ($type == 1) {
                    $pinyin [] = $this->c($str);
                } else {
                    $pinyin [] = $this->f($str);
                }
                $i = $i + 1;
            } else
                break;
        }
        return $pinyin;
    }

    private function g($num) {
        if ($num > 0 && $num < 160) {
            return chr($num);
        } elseif ($num < -20319 || $num > -10247) {
            return '';
        } else {
            for ($i = count($this->d) - 1; $i >= 0; $i--) {
                if ($this->d[$i][1] <= $num)
                    break;
            }
            return $this->d[$i][0];
        }
    }

    private function c($str) {
        $ret = '';
        for ($i = 0; $i < strlen($str); $i++) {
            $p = ord(substr($str, $i, 1));

            if ($p > 160) {

                $q = ord(substr($str, ++$i, 1));

                $p = $p * 256 + $q - 65536;
            }
            $ret .= $this->g($p);
        }
        $ret = substr($ret, 0, 1);
        return $ret;
    }

    private function f($str) {
        $ret = '';
        for ($i = 0; $i < strlen($str); $i++) {
            $p = ord(substr($str, $i, 1));
            if ($p > 160) {
                $q = ord(substr($str, ++$i, 1));
                $p = $p * 256 + $q - 65536;
            }
            $ret .= $this->g($p);
        }
        return $ret;
    }

}
